import type {EventCallbackFunction, EventType} from "@/event/index";
import EventDispatch from "@/event/EventDispatch.ts";

/**
 * 全局事件总线, 事件订阅监听处理类
 */
export default class EventListener {
    private static dispatch: EventDispatch = EventDispatch.getInstance();
    /**
     * 全局事件监听注册处理方法
     * @param {string} eventType - 事件监听类型
     * @param {function} callback - 事件监听的回调方法
     * @param {string} identity - 监听者的身份标识, 用于取消对事件的监听
     * @remarks
     * - 监听器将仅响应与与“eventType”完全匹配的事件
     * - 必须调用 'ack' 函数以防止内存泄漏
     * - 同一个身份不可以重复监听同一个事件类型的事件
     * returns {void}
     */
    public static listener<T extends EventType>(eventType: T, callback: EventCallbackFunction<T>, identity: string){
        this.dispatch.addListener(eventType, callback, identity);
    }

    /**
     * 全局事件监听取消处理方法
     * @param eventType - 取消事件监听类型
     * @param identity - 取消事件监听的监听者的标识
     */
    public static unListener(eventType: EventType, identity: string){
        this.dispatch.removeListener(eventType, identity);
    }
}